Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update what-is-extra.md #10

Merged
merged 1 commit into from
Aug 8, 2024
Merged

Update what-is-extra.md #10

merged 1 commit into from
Aug 8, 2024

Conversation

ArtemKot4
Copy link
Collaborator

No description provided.

Copy link
Member

@MaXFeeD MaXFeeD left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Требуются незначительные правки перед публикацией, они будут внесены позже.


## Куда передавать
# Что такое экстра?
Как мы знаем, в игре существует множество предметов. И каждый из них может иметь свои данные. Такими предметами являются предметы, которые имеют один и тот же идентификатор, но при этом не могут быть сложены в один стак и чем-то отличаются. Одним из таких предметов является зачарованная книга.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Желательно с конкретикой описать отличия, либо в целом не писать о них; например сделать подводку к экстре, ведь именно за счет нее предметы и не стакаются. Про зачарованную книгу требуется пояснение, поскольку непонятно к чему она приведена.

Представим такую ситуацию. У вас есть магический кристалл, на котором вычерчены древние руны. Поскольку руны хранят информацию, нам нужно, чтобы разные кристаллы хранили в себе разные руны. Чтобы это реализовать, нам и понадобятся данные предметов.
## Внесение данных
Давайте попробуем создать механику присвоения случайных рун нашему магическому кристаллу. Но что нам для этого нужно? Нам нужно хранилище, куда будут помещены наши данные.
### Класс ItemExtraData
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Документация обычно не разделяется на конкретные классы, тем более что вся статья описывает изменение ItemExtraData.

Comment on lines +9 to +21
Создадим функцию, добавляющую в список текста наших рун, и список:
```js
const runeList = [];
function addRune(text) {
runeList.push(text);
};
```
Отлично, теперь мы имеем хранилище. Давайте зарегистрируем для нашего примера несколько текстов
```js
addRune("magic");
addRune("twilight");
addRune("fire");
```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Важно, чтобы вводные данные были максимально компактны, если прочего не требует код. Это поможет сразу понять с чем мы имеем дело, быстро входя в возможности рассматриваемого класса/функции и прочего.

Suggested change
Создадим функцию, добавляющую в список текста наших рун, и список:
```js
const runeList = [];
function addRune(text) {
runeList.push(text);
};
```
Отлично, теперь мы имеем хранилище. Давайте зарегистрируем для нашего примера несколько текстов
```js
addRune("magic");
addRune("twilight");
addRune("fire");
```
Для начала, создадим список рун, который будет использоваться нашей экстрой для определения типа руны:
```js
const RUNES = [
"magic",
"twilight",
"fire"
];

Comment on lines +88 to +99
> Давайте улучшим нашу функцию, и если экстра уже будет присутствовать, то мы будем выводить значение в чат.
> ```js
Item.registerUseFunctionForID(ItemID["magic_crystal"], function (coords, item, block, player) {
if(block.id === VanillaBlockID.stone) {
if(!item.extra || (item.extra && item.extra.getString("rune") === null)) {
Entity.setCarriedItem(item.id, item.count, item.data, giveRandomRune());
} else {
Game.message("Rune name: " + item.extra && item.extra.getString("rune"));
}
}
})
```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сноски не рекомендуются, специально для этого созданы Admoniconы:

Suggested change
> Давайте улучшим нашу функцию, и если экстра уже будет присутствовать, то мы будем выводить значение в чат.
> ```js
Item.registerUseFunctionForID(ItemID["magic_crystal"], function (coords, item, block, player) {
if(block.id === VanillaBlockID.stone) {
if(!item.extra || (item.extra && item.extra.getString("rune") === null)) {
Entity.setCarriedItem(item.id, item.count, item.data, giveRandomRune());
} else {
Game.message("Rune name: " + item.extra && item.extra.getString("rune"));
}
}
})
```
:::tip Давайте улучшим!
Например, если экстра уже присутствует, выведем значение в чат:
```js
Item.registerUseFunctionForID(ItemID.magic_crystal, function (coords, item, block, player) {
if (block.id == VanillaBlockID.stone) {
if (!item.extra || (item.extra && item.extra.getString("rune") == null)) {
Entity.setCarriedItem(item.id, item.count, item.data, giveRandomRune());
} else {
Game.message("Rune name: " + item.extra.getString("rune"));
}
}
});

:::

А поскольку мы можем манипулировать этими данными, мы можем использовать любой метод для выдачи предмета, в который можно будет как раз таки передать наши данные.
Давайте реализуем присвоение случайной руны нашему кристаллу после клика им о камень:
```js
Item.registerUseFunctionForID(ItemID["magic_crystal"], function (coords, item, block, player) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ItemID.magic_crystal

const extraDataNew = new ItemExtraData(extraDataOld);
extraDataNew.putString("new_rune", "cave");
```
Что такое putString? Дело в том, что ItemExtraData реализует способ передачи и получения данных класса CompoundTag.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

putString был использован в прошлой функции, но описывается здесь, важно включать пояснение к новым вызовам сразу.

extraData.getObject("object_key", {fruit: "apple"}); //мы получаем объект с данными, если его нет, то получим {fruit: "apple"}
extraData.getLong("long_key", 10000) //мы получаем число вида long, если его нет, то получим 10000
```
Важно заметить, что второй аргумент необязателен, и если его не будет и значения ключа тоже, то вернётся null.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

null вернется лишь в случае объекта или строки, иначе вернется 0, 0.0, false и 0 соответственно.

addRune("twilight");
addRune("fire");
```
Сделаем функцию, которая будет возвращать экземпляр класса ItemExtraData, содержащий случайную руну из списка;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Сделаем функцию, которая будет возвращать экземпляр класса ItemExtraData, содержащий случайную руну из списка;
Сделаем функцию, которая будет возвращать экземпляр класса ItemExtraData, содержащий случайную руну из списка:

}
})
```
Теперь, при клике кристаллом по камню, кристаллу присвоится случайная руна, если руна не была присвоена ранее.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мы до функции указали что собираемся сделать, лучше внести ясность что конкретно происходит в "адском" условии, например:

Suggested change
Теперь, при клике кристаллом по камню, кристаллу присвоится случайная руна, если руна не была присвоена ранее.
При клике по камню если экстры еще нет, либо информации о руне в ней не существует, будет присвоена руна случайная из нашего списка в начале статьи.

Comment on lines +78 to +86
```js
const extraData = new ItemExtraData();
extraData.getInt("int_key", 10) //мы получаем число, и если его нет, то получим 10
extraData.getString("string_key", "random_rune"); //мы получаем строку, если её нет, то получим "random_rune"
extraData.getFloat("float_key", 1.1) //мы получаем число с десятичной частью, если его нет, то получим 1.1
extraData.getBoolean("boolean_key", true); //мы получаем булевое значение, если его нет, то получим true
extraData.getObject("object_key", {fruit: "apple"}); //мы получаем объект с данными, если его нет, то получим {fruit: "apple"}
extraData.getLong("long_key", 10000) //мы получаем число вида long, если его нет, то получим 10000
```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стандартизируем, например:

Suggested change
```js
const extraData = new ItemExtraData();
extraData.getInt("int_key", 10) //мы получаем число, и если его нет, то получим 10
extraData.getString("string_key", "random_rune"); //мы получаем строку, если её нет, то получим "random_rune"
extraData.getFloat("float_key", 1.1) //мы получаем число с десятичной частью, если его нет, то получим 1.1
extraData.getBoolean("boolean_key", true); //мы получаем булевое значение, если его нет, то получим true
extraData.getObject("object_key", {fruit: "apple"}); //мы получаем объект с данными, если его нет, то получим {fruit: "apple"}
extraData.getLong("long_key", 10000) //мы получаем число вида long, если его нет, то получим 10000
```
```js
const extraData = new ItemExtraData();
extraData.getInt("int_key", 10); // вернется целочисленное число по ключу "int_key", либо же 10 если его нет
extraData.getString("string_key", "random_rune"); // вернется строка по ключу "string_key", либо же "random_rune" если ее нет
extraData.getFloat("float_key", 1.1) // вернется число с дробью по ключу "float_key", либо же 1.1 если его нет
extraData.getBoolean("boolean_key", true); // вернется буль по ключу "boolean_key", либо же true если его нет
extraData.getObject("object_key", { fruit: "apple" }); // вернется объект по ключу "object_key", либо же приведенный объект если его нет
extraData.getLong("long_key", 2147483648); // вернется большое число по ключу "long_key", либо же 2147483648 если его нет

@MaXFeeD MaXFeeD merged commit c699cb3 into Nernar:master Aug 8, 2024
2 checks passed
github-actions bot pushed a commit that referenced this pull request Aug 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants